#include "file_manager.h"

// 显示命令提示符
void show_prompt() {
    printf("> ");
    fflush(stdout);
}

// 显示帮助信息
void show_help() {
    printf("可用命令:\n");
    printf("  myls [目录路径]          - 列出目录内容\n");
    printf("  mymkdir <目录路径>       - 创建新目录\n");
    printf("  myrm <文件路径>          - 删除文件\n");
    printf("  cp_stdio <源> <目标>   - 使用标准IO复制文件\n");
    printf("  cp_sysio <源> <目标>   - 使用系统IO复制文件\n");
    printf("  view <文件路径>        - 查看文件内容\n");
    printf("  create <文件路径>      - 创建新文件\n");
    printf("  write <文件路径> <内容> - 写入内容到文件\n");
    printf("  info <文件路径>        - 显示文件信息\n");
    printf("  lock <文件路径> [r|w]  - 锁定文件(默认写锁，r:读锁，w:写锁)\n");
    printf("  unlock <文件路径>      - 解锁文件\n");
    printf("  help                   - 显示帮助信息\n");
    printf("  exit                   - 退出程序\n");
}

// 解析命令
void parse_command(char *command, char **args, int *arg_count) {
    char *token = strtok(command, " ");
    *arg_count = 0;
    
    while (token != NULL && *arg_count < MAX_ARGS - 1) {
        args[(*arg_count)++] = token;
        token = strtok(NULL, " ");
    }
    
    args[*arg_count] = NULL;
}

// 执行命令
int execute_command(char **args, int arg_count) {
    if (strcmp(args[0], "exit") == 0 || strcmp(args[0], "quit") == 0) {
        return -1;
    } else if (strcmp(args[0], "help") == 0) {
        show_help();
    } else if (strcmp(args[0], "myls") == 0) {
        if (arg_count < 2) {
            list_directory(".");
        } else {
            list_directory(args[1]);
        }
    } else if (strcmp(args[0], "mymkdir") == 0) {
        if (arg_count < 2) {
            printf("用法: mymkdir <目录路径>\n");
        } else {
            create_directory(args[1]);
        }
    } else if (strcmp(args[0], "myrm") == 0) {
        if (arg_count < 2) {
            printf("用法: myrm <文件路径>\n");
        } else {
            remove_file(args[1]);
        }
    } else if (strcmp(args[0], "cp_stdio") == 0) {
        if (arg_count < 3) {
            printf("用法: cp_stdio <源文件> <目标文件>\n");
        } else {
            copy_file_stdio(args[1], args[2]);
        }
    } else if (strcmp(args[0], "cp_sysio") == 0) {
        if (arg_count < 3) {
            printf("用法: cp_sysio <源文件> <目标文件>\n");
        } else {
            copy_file_sysio(args[1], args[2]);
        }
    } else if (strcmp(args[0], "view") == 0) {
        if (arg_count < 2) {
            printf("用法: view <文件路径>\n");
        } else {
            view_file(args[1]);
        }
    } else if (strcmp(args[0], "create") == 0) {
        if (arg_count < 2) {
            printf("用法: create <文件路径>\n");
        } else {
            create_file(args[1]);
        }
    } else if (strcmp(args[0], "write") == 0) {
        if (arg_count < 3) {
            printf("用法: write <文件路径> <内容> [keep|sleep <秒数>]\n");
            printf("  keep   - 保持文件锁定状态\n");
            printf("  sleep  - 保持文件锁定指定秒数后自动解锁\n");
        } else {
            // 检查是否有keep或sleep参数
            int keep_lock = 0;
            int sleep_seconds = 0;
            
            if (arg_count >= 4) {
                if (strcmp(args[3], "keep") == 0) {
                    keep_lock = 1;
                } else if (strcmp(args[3], "sleep") == 0 && arg_count >= 5) {
                    keep_lock = 1;
                    sleep_seconds = atoi(args[4]);
                    if (sleep_seconds <= 0) {
                        printf("警告: 无效的睡眠时长，将使用默认值5秒\n");
                        sleep_seconds = 5;
                    }
                }
            }
            
            int result = write_to_file(args[1], args[2], keep_lock);
            
            // 如果请求了睡眠，则在指定时间后解锁
            if (result == 0 && sleep_seconds > 0) {
                printf("文件已加锁，将在%d秒后自动解锁...\n", sleep_seconds);
                sleep(sleep_seconds);
                printf("时间到，正在解锁文件...\n");
                unlock_file_by_path(args[1]);
            }
        }
    } else if (strcmp(args[0], "info") == 0) {
        if (arg_count < 2) {
            printf("用法: info <文件路径>\n");
        } else {
            SimpleFileInfo info;
            if (get_file_info(args[1], &info) == 0) {
                print_file_info(&info);
            } else {
                printf("无法获取文件信息: %s\n", strerror(errno));
            }
        }
    } else if (strcmp(args[0], "lock") == 0) {
        if (arg_count < 2) {
            printf("用法: lock <文件路径> [r|w]\n");
        } else {
            LockType type = LOCK_WRITE; // 默认写锁
            if (arg_count >= 3) {
                if (strcmp(args[2], "r") == 0) {
                    type = LOCK_READ;
                } else if (strcmp(args[2], "w") == 0) {
                    type = LOCK_WRITE;
                }
            }
            lock_file_by_path(args[1], type);
        }
    } else if (strcmp(args[0], "unlock") == 0) {
        if (arg_count < 2) {
            printf("用法: unlock <文件路径>\n");
        } else {
            unlock_file_by_path(args[1]);
        }
    } else {
        printf("未知命令: %s。输入 'help' 查看可用命令。\n", args[0]);
    }
    
    return 0;
}